package com.mms.controller;


import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.github.pagehelper.Page;
import com.mms.dao.IUserInfoDao;
import com.mms.enumerate.CodeEnum;
import com.mms.pojo.UserInfo;
import com.mms.service.IRoleInfoService;
import com.mms.service.IRoleResourceService;
import com.mms.service.IUserInfoService;
import com.mms.utils.LayUiPage;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.util.List;
import java.util.Map;

/**
 * <p>
 * 处理user_info表的业务
 * </p>
 *
 * @author 陈林鹏
 * @since 2021-04-14
 */
@Controller
@RequestMapping("/userInfo")
public class UserInfoController {

    /**
     * 用户服务表
     */
    @Autowired
    IUserInfoService userInfoService;

    /**
     * 角色资源服务表
     */
    @Autowired
    IRoleResourceService roleResourceService;

    /**
     * 角色信息服务表
     */
    @Autowired
    IRoleInfoService roleInfoService;
    /**
     * 用户信息
     */
    @Autowired
    IUserInfoDao userInfoDao;


    /**
     * <p>
     * 登录验证
     * </p>
     *
     * @param userName 用户名
     * @param passWord 用户密码
     * @return retJson
     */
    @ResponseBody
    @RequestMapping(value = "/loginVerify")
    public String loginVerify(HttpServletRequest request, @RequestParam("username") String userName
            , @RequestParam("password") String passWord) {
//        System.out.println(userName);
        //创建返回 json 对象
        JSONObject retJson = new JSONObject();

        //验证账号是否存在
        if (!userInfoService.verifyUserName(userName)) {
            //账号 不存在 返回 用户名不存在
            retJson.put("state", "0");
            retJson.put("reason", "用户名不存在");
            return retJson.toString();
        }

        //验证 用户名和密码 是否匹配
        UserInfo userInfo = userInfoService.verifyUser(userName, passWord);
        if (userInfo == null) {
            //如果用户和密码 不匹配 返回 用户密码错误
            retJson.put("state", "0");
            retJson.put("reason", "用户密码错误");
            return retJson.toString();
        }
        //用户名和密码匹配 返回登录成功
        retJson.put("state", "200");
        retJson.put("reason", "登录成功");
        //将用户信息存入 Session
        request.getSession().setAttribute("userinfo", userInfo);

        return retJson.toString();
    }

    /**
     * 注册用户
     *
     * @param request  用户跟踪 session
     * @param userInfo 用户信息
     * @return retJson
     */
    @ResponseBody
    @RequestMapping(value = "/signIn")
    public String signIn(HttpServletRequest request, UserInfo userInfo) {
        //创建返回 json对象
        JSONObject retJson = new JSONObject();
        //如果userinfo是空
        if (userInfo == null) {
            //返回 状态state 0 并返回一个 ？ 迷糊敌人
            retJson.put("state", "0");
            retJson.put("reason", "？");
            return retJson.toString();
        }
        //对用户名进行一个空检查
        if (userInfo.getUsername() == null ||
                userInfo.getUsername().equals("")) {
            retJson.put("state", "0");
            retJson.put("reason", "请输入用户名");
            return retJson.toString();
        }
        if (userInfo.getNickname() == null ||
                userInfo.getNickname().equals("")) {
            //如果用户昵称是空的 就将用户名设置为用户昵称
            userInfo.setNickname(userInfo.getUsername());
        }
        //验证用户密码是否输入
        if (userInfo.getPassword() == null ||
                userInfo.getPassword().equals("")) {
            retJson.put("state", "0");
            retJson.put("reason", "请输入密码");
            return retJson.toString();
        }
        //正则表达式匹配用户名是否包含中文
        if (userInfo.getUsername().matches("^.*[\\u4e00-\\u9fa5]{1,}.*")) {
            retJson.put("state", "0");
            retJson.put("reason", "用户名不能有中文");
            return retJson.toString();
        }
        //正则表达式匹配密码内中文
        if (userInfo.getPassword().matches("^.*[\\u4e00-\\u9fa5]{1,}.*")) {
            retJson.put("state", "0");
            retJson.put("reason", "密码不能有中文");
            return retJson.toString();
        }
        //到数据库验证一下用户名 是否存在
        if (userInfoService.verifyUserName(userInfo.getUsername())) {
            retJson.put("state", "0");
            retJson.put("reason", "用户名已存在");
            return retJson.toString();
        }
        UserInfo user = userInfoService.createUser(userInfo);
        HttpSession session = request.getSession();
        session.setAttribute("userinfo", user);
        retJson.put("state", "200");
        retJson.put("reason", "注册成功!");

        return retJson.toString();
    }


    /**
     * 获取用户信息
     *
     * @param pageNum
     * @param limit
     * @return
     */
    @ResponseBody
    @RequestMapping(value = "getAllUserInfo")
    public String getAllUserInfo(@RequestParam(value = "page") Integer pageNum,
                                 Integer limit) {
        //使用layui 自带的 分页功能
        Page page = LayUiPage.parse(pageNum, limit);

        //查询 用户所有的 数据
        List<UserInfo> userInfos = userInfoService.selectList(new EntityWrapper<>());
        //如果没有数据 返回
        if (userInfos == null || userInfos.size() == 0) {
            return CodeEnum.noData.toString();
        }
        JSONObject retJson = new JSONObject();

        retJson.put("code", 0);
        retJson.put("msg", "成功");
        retJson.put("count", page.getTotal());
        retJson.put("data", userInfos);

        return retJson.toString(SerializerFeature.DisableCircularReferenceDetect);
    }

    /**
     * 更新用户信息
     *
     * @param userInfo
     * @return
     */
    @ResponseBody
    @RequestMapping(value = "updateUserInfo")
    public String updateUserInfo(UserInfo userInfo) {
        //去除头尾空格
        userInfo.setPassword(userInfo.getPassword().trim());
        //判断 是否 为空
        if (userInfo == null) {
            //异常返回
            return CodeEnum.failMsg("提交空的数据");
        }
        //更新用户数据
        if (!userInfoService.updateById(userInfo)) {
            //修改失败返回
            return CodeEnum.ModificationFailed.toString();
        }
        //修改成功返回
        return CodeEnum.ModifiedSuccessfully.toString();
    }

    /**
     * 创建用户
     *
     * @param userInfo   用户信息
     * @param roleInfoId 角色信息表Id
     * @return
     */
    @ResponseBody
    @RequestMapping(value = "insertUserInfo")
    public String insertUserInfo(UserInfo userInfo, Integer roleInfoId) {

        if (userInfo == null || userInfo.getUsername().equals("") ||
                userInfo.getNickname().equals("") ||
                userInfo.getPassword().equals("")) {
            //UserInfo 格式不正确
            return CodeEnum.abnormal.toString();
        }
        //到角色表查询数据
        try {
            userInfoService.createUser(userInfo, roleInfoId);
        } catch (Exception e) {
            e.printStackTrace();
            //返回异常
            return CodeEnum.abnormal.toString();

        }

        //修改成功返回
        return CodeEnum.ModifiedSuccessfully.toString();
    }

    /**
     * 删除用户信息
     *
     * @param userIds
     * @return
     */
    @ResponseBody
    @RequestMapping(value = "deleteUserinfo")
    public String deleteUserinfo(@RequestParam(value = "userId[]") Integer[] userIds) {


        //批量删除
        if (!userInfoService.deleteBatchById(userIds)) {
            //删除失败返回
            return CodeEnum.ModificationFailed.toString();
        }

        //删除成功返回
        return CodeEnum.SuccessfullyDeleted.toString();
    }


    /**
     * 资源和角色表
     *
     * @return
     */
    @ResponseBody
    @RequestMapping(value = "getRoleResource")
    public String getRoleResource(@RequestParam(value = "page") Integer pageNum,
                                  Integer limit) {
        Page page = LayUiPage.parse(pageNum, limit);

        /**
         * 角色资源表
         */
        List<Map<String, Object>> roleResource = roleResourceService.getRoleResource();

        //打包返回
        JSONObject retJson = new JSONObject();
        retJson.put("code", 0);
        retJson.put("count", page.getTotal());
        retJson.put("msg", "成功");
        retJson.put("data", roleResource);

        return retJson.toString(SerializerFeature.DisableCircularReferenceDetect);
    }


    /**
     * 用户角色表
     *
     * @param pageNum
     * @param limit
     * @return
     */
    @ResponseBody
    @RequestMapping(value = "getUserRole")
    public String getUserRole(@RequestParam(value = "page") Integer pageNum,
                              Integer limit) {
        Page page = LayUiPage.parse(pageNum, limit);

        //用户角色表
        List<Map<String, Object>> roleResource = roleInfoService.getRoleUserinfo();
        for (Map<String, Object> stringObjectMap : roleResource) {
            stringObjectMap.put("PASSWORD", " ");
        }
        //打包返回
        JSONObject retJson = new JSONObject();
        retJson.put("code", 0);
        retJson.put("count", page.getTotal());
        retJson.put("msg", "成功");
        retJson.put("data", roleResource);

        return retJson.toString(SerializerFeature.DisableCircularReferenceDetect);
    }

    /**
     * 更换用户角色
     *
     * @param userinfoId
     * @param roleId
     * @return
     */
    @ResponseBody
    @RequestMapping(value = "updateUserRole")
    public String updateUserRole(Integer userinfoId, Integer roleId) {

        //更新userRole 用户角色表
        if (!userInfoDao.updateUserRole(userinfoId, roleId)) {
            return CodeEnum.ModificationFailed.toString();
        }
        return CodeEnum.success.toString();
    }


    @RequestMapping(value = "showUserinfo")
    public ModelAndView showUserinfo(HttpServletRequest request) {

        UserInfo userinfo = (UserInfo) request.getSession().getAttribute("userinfo");
        ModelAndView mv = new ModelAndView();
        mv.addObject("userinfo", userinfo);
        mv.setViewName("userinfo/UserInfo");
        return mv;
    }

    @RequestMapping(value = "updateUserinfoNamePassword")
    public String updateUserinfoNamePassword(HttpServletRequest request,
                                             @RequestParam(value = "password") String password,
                                             @RequestParam(value = "nickname") String nickname) {
        UserInfo SessionUserinfo = (UserInfo) request.getSession().getAttribute("userinfo");
        //创建用户对象
        UserInfo userInfo = new UserInfo();
        //设置用户Id
        userInfo.setId(SessionUserinfo.getId());
        //设置用户 昵称
        userInfo.setNickname(nickname);
        //设置用户密码
        userInfo.setPassword(password);
        //更新用户密码 和 昵称
        userInfoDao.updateById(userInfo);
        UserInfo userInfo1 = userInfoDao.selectById(SessionUserinfo.getId());
        request.getSession().setAttribute("userinfo", userInfo1);
        return "forward:/userInfo/showUserinfo";
    }

}

